import java.awt.*;

public class MapTop {//顶层地图类，绘制顶层游戏组件

    int tempX;
    int tempY;//格子坐标

    void reGame(){//重置游戏
        for (int i = 1; i <=GameUtil.Width ; i++) {
            for (int j = 1; j <=GameUtil.Height ; j++) {
                GameUtil.ElementTop[i][j]=0;//全部格子置为空
            }
        }
    }
    
    void logic(){//判断逻辑

        tempX=0;
        tempY=0;
        if(GameUtil.MouseX>GameUtil.Offset && GameUtil.MouseY>3*GameUtil.Offset){
            tempX = (GameUtil.MouseX - GameUtil.Offset)/GameUtil.SquareLength+1;
            tempY = (GameUtil.MouseY - GameUtil.Offset * 3)/GameUtil.SquareLength+1;
        }//当鼠标点击为游戏框内，记录鼠标点击的坐标

        if(tempX>=1 && tempX<=GameUtil.Width&& tempY>=1 && tempY<=GameUtil.Height){
            if(GameUtil.Left){
                if(GameUtil.ElementTop[tempX][tempY]==0){//如果格子覆盖,则翻开格子（无覆盖-1）
                    GameUtil.ElementTop[tempX][tempY]=-1;
                }
                spaceOpen(tempX,tempY);
                GameUtil.Left=false;
            }
            if(GameUtil.Right){
                if(GameUtil.ElementTop[tempX][tempY]==0){//如果格子覆盖,则插旗1
                    GameUtil.ElementTop[tempX][tempY]=1;
                    GameUtil.FlagNumber++;
                }
                else if(GameUtil.ElementTop[tempX][tempY]==1){//如果格子已经有插旗,则取消
                    GameUtil.ElementTop[tempX][tempY]=0;
                    GameUtil.FlagNumber--;
                }
                else if(GameUtil.ElementTop[tempX][tempY]==-1){//如果格子无覆盖,则没有变化
                    
                }
                GameUtil.Right=false;
            }
        }
        boom();
        victory();
    }
    
    void paintSelf(Graphics g){//顶层画布绘制
        logic();
        for (int i = 1; i <= GameUtil.Width ; i++) {
            for (int j = 1; j <= GameUtil.Height; j++) {
                if (GameUtil.ElementTop[i][j] == 0) {//绘制覆盖的格子
                    g.drawImage(GameUtil.top,
                            GameUtil.Offset + (i - 1) * GameUtil.SquareLength + 1,
                            GameUtil.Offset * 3 + (j - 1) * GameUtil.SquareLength + 1,
                            GameUtil.SquareLength - 2,
                            GameUtil.SquareLength - 2,
                            null);
                }
                if (GameUtil.ElementTop[i][j] == 1) {//绘制已经插上的旗子
                    g.drawImage(GameUtil.flag,
                            GameUtil.Offset + (i - 1) * GameUtil.SquareLength + 1,
                            GameUtil.Offset * 3 + (j - 1) * GameUtil.SquareLength + 1,
                            GameUtil.SquareLength - 2,
                            GameUtil.SquareLength - 2,
                            null);
                }
                if (GameUtil.ElementTop[i][j] == 2) {//绘制插错的旗子
                    g.drawImage(GameUtil.noflag,
                            GameUtil.Offset + (i - 1) * GameUtil.SquareLength + 1,
                            GameUtil.Offset * 3 + (j - 1) * GameUtil.SquareLength + 1,
                            GameUtil.SquareLength - 2,
                            GameUtil.SquareLength - 2,
                            null);
                }
            }
        }
    }
    
    
    boolean boom(){//失败判定  true 表示游戏失败 false 未失败      
        for (int i = 1; i <=GameUtil.Width ; i++) {
            for (int j = 1; j <=GameUtil.Height ; j++) {
                if(GameUtil.ElementBottom[i][j]==-1&&GameUtil.ElementTop[i][j]==-1){//底层为雷，顶层格子 未覆盖
                   GameUtil.state = 2;//游戏状态失败
                    seeBoom();
                    return true;
                }
            }
        }       
        return false;
    }
    
    void seeBoom(){//失败显示地雷位置
        for (int i = 1; i <=GameUtil.Width ; i++) {
            for (int j = 1; j <=GameUtil.Height ; j++) {            
                if(GameUtil.ElementBottom[i][j]==-1&&GameUtil.ElementTop[i][j]!=1){//底层是雷,顶层不是旗,显示地雷
                    GameUtil.ElementTop[i][j]=-1;
                }      
                if(GameUtil.ElementBottom[i][j]!=-1&&GameUtil.ElementTop[i][j]==1){//底层不是雷,顶层是旗,显示插错旗子
                    GameUtil.ElementTop[i][j]=2;
                }
            }
        }
    }
    
    boolean victory(){//游戏通关判断  true表示通过 false表示通关失败
        int count=0;//统计未打开格子数
        for (int i = 1; i <=GameUtil.Width ; i++) {
            for (int j = 1; j <=GameUtil.Height ; j++) {
                if(GameUtil.ElementTop[i][j]!=-1){
                    count++;
                }
            }
        }
        if(count==GameUtil.MineNumber){//剩下为翻开的格子全是地雷
            GameUtil.state=1;//游戏状态通关
            for (int i = 1; i <=GameUtil.Width ; i++) {
                for (int j = 1; j <=GameUtil.Height ; j++) {                
                    if(GameUtil.ElementTop[i][j]==0){//未翻开的格子全部翻开
                        GameUtil.ElementTop[i][j]=-1;
                    }
                }
            }
            return true;
        }
        return false;
    }

    void spaceOpen(int x,int y){//打开附近没有地雷的空格
        if(GameUtil.ElementBottom[x][y]==0){
            for (int i = x-1; i <=x+1 ; i++) {
                for (int j = y-1; j <=y+1 ; j++) { 
                    if(GameUtil.ElementTop[i][j]!=-1){//还有格子覆盖,未被翻开
                        if(GameUtil.ElementTop[i][j]==1){GameUtil.FlagNumber--;}//有插旗的地方无地雷，旗子数减一
                        GameUtil.ElementTop[i][j]=-1;
                        if(i>=1&&j>=1&&i<=GameUtil.Width&&j<=GameUtil.Height){//保证还在游戏款框中
                            spaceOpen(i,j);
                        }
                    }
                }
            }
        }
    }
    
    
}
